// 下面两个package要单独安装
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'

export default {
  install(Vue, options) {
    /**
     * 【id】：导出内容的页面元素id
     * 【title】：导出文件标题
     * 【pageType】：分页类型，默认不分页，分业模式默认：'a4'
     **/ 
    Vue.prototype.getPdf = function (id, title, dpi, pageType, callback) {
      html2Canvas(document.querySelector(`#${id}`), {
        dpi: dpi,
        // allowTaint: true //允许 canvas 污染， allowTaint参数要去掉，否则是无法通过toDataURL导出canvas数据的
        useCORS: true //允许canvas画布内 可以跨域请求外部链接图片, 允许跨域请求。
      }).then(function (canvas) {
        let contentWidth = canvas.width
        let contentHeight = canvas.height
        let pageData = canvas.toDataURL('image/jpeg', 1.0)
        let PDF

        try {
          if(pageType) {
            //一页pdf显示html页面生成的canvas高度;
            let pageHeight = contentWidth / 592.28 * 841.89
            //未生成pdf的html页面高度
            let leftHeight = contentHeight
            //pdf页面偏移
            let position = 0
            //html页面生成的canvas在pdf中图片的宽高（a4纸的尺寸[595.28,841.89]）
            let imgWidth = 595.28
            let imgHeight = 592.28 / contentWidth * contentHeight
            
            PDF = new JsPDF('', 'pt', 'a4')
            //有两个高度需要区分，一个是html页面的实际高度，和生成pdf的页面高度(841.89)
            //当内容未超过pdf一页显示的范围，无需分页
            if (leftHeight < pageHeight) {
              PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
            } else {
              while (leftHeight > 0) {
                PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
                leftHeight -= pageHeight
                position -= 841.89
                if (leftHeight > 0) {
                  PDF.addPage()
                }
              }
            }
          } else {
            // 设定pdf宽高，px与pt转换关系：px = pt*dpi/72
            PDF = new JsPDF('', 'pt', [
              (contentWidth+40) * 72 / dpi, // 加40是为了两边预留20px间隙
              contentHeight * 72 / dpi
            ])
            PDF.addImage(pageData, 'JPEG', (20* 72 / dpi), 0, contentWidth * 72 / dpi, contentHeight * 72 / dpi)
          }
  
          PDF.save(title + '.pdf')
          callback && callback(true)
        } catch (err) {
          callback && callback(false, err)
        }
      })
    }
  }
}
